出处:掘金
原作者:ErpanOmer
Cumulative Layout Shift (CLS) 是 Google 的核心网页指标(Core Web Vitals)之一,用于衡量网页在加载过程中发生的视觉稳定性。这一指标的提出旨在改善用户体验,因为频繁的布局变化会让用户感到困惑,甚至误操作
本文将深入探讨 CLS 的定义、计算方式、常见问题以及优化方法,并通过代码实例和工具展示如何高效处理 CLS 问题
CLS 是衡量网页布局在加载或交互过程中发生的非预期视觉移动的总量。它量化了用户因内容移动而体验到的视觉不稳定性
定义:
CLS 的计算公式基于以下两个因素:
Impact Fraction = 移动后面积 / 视口面积Distance Fraction = 移动距离 / 视口高度CLS = Impact Fraction × Distance Fraction
借助 web-vitals 库动态检测 CLS 值:
import { onCLS } from 'web-vitals';
onCLS((metric) => {
console.log('Current CLS value:', metric.value);
});
使用 Chrome DevTools 的 Lighthouse 生成页面性能报告,可以清晰看到 CLS 的问题来源
手动调试 CLS 问题:
问题:加载图片时,页面先渲染文本或其他内容,图片加载后挤压布局
问题:广告框架加载后推挤主要内容
问题:加载 JavaScript 时插入新内容导致布局变化
示例:
const newElement = document.createElement('div');
newElement.textContent = '动态内容';
document.body.appendChild(newElement);
通过设置宽高属性或使用 CSS aspect-ratio,确保页面在加载时为图片预留空间
<img src="example.jpg" width="400" height="300" alt="example">
img {
aspect-ratio: 4 / 3;
width: 100%;
}
确保动态加载的内容在初始渲染时有固定的占位符
<div style="width: 300px; height: 250px;">广告位</div>
在需要动态加载内容时,确保使用占位符或预留空间
const placeholder = document.createElement('div');
placeholder.style.height = '50px';
document.body.appendChild(placeholder);
// 动态加载内容
setTimeout(() => {
placeholder.textContent = '动态内容';
}, 2000);
使用 font-display: swap 确保文本在字体加载时显示替代字体,避免内容跳动
在动画中使用 transform 和 opacity 而非 margin 或 width 等影响布局的属性
.bad-example {
margin-left: 20px; /* 可能导致布局变化 */
}
.good-example {
transform: translateX(20px); /* 不会影响布局 */
}
Google 官方工具,生成页面性能报告,提供 CLS 问题的详细分析
全面测试网站性能,分析 CLS 值和改进建议
DevTools 中的 Performance 面板可以手动调试布局变化
Cumulative Layout Shift (CLS) 是衡量页面视觉稳定性的关键指标,直接影响用户体验和 SEO 排名。通过为图片和广告指定尺寸、优化动态内容加载、减少字体加载影响等方法,可以有效降低 CLS 值,提升页面性能和用户满意度
在未来的网页开发中,优化 CLS 应成为开发者的标准实践,以确保为用户提供稳定流畅的浏览体验